#include <memory.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

int new() {
    return 11;
}

int template_new()
{
    typedef int (*p_fun)();
    int code[] = {
        0xff010113, // addi    sp,sp,-16
        0x00813423, // sd      s0,8(sp)
        0x01010413, // addi    s0,sp,16
        0x00b00793, // li      a5,11
        0x00078513, // mv      a0,a5
        0x00813403, // ld      s0,8(sp)
        0x01010113, // addi    sp,sp,16
        0x00008067, // ret
    };

    // 相当于在内存中开辟一片可读可写可执行的区域（准确说是一页），然后把code数组的内容拷贝进去
    void *temp = mmap(
        NULL,
        getpagesize(),
        PROT_READ | PROT_WRITE | PROT_EXEC,
        MAP_ANONYMOUS | MAP_PRIVATE,
        -1,
        0
    );
    memcpy(temp, code, sizeof(code));

    p_fun fun = temp;
    return fun();
}

int main()
{
    int obj = new();
    int obj2 = template_new();

    printf("%d\n", obj);
    printf("%d\n", obj2);
    return 0;
}